Control Structures — GDScript
Skill codes on this page
| Code | Level | Skill |
|---|---|---|
| C625 | 3–4 | control structure — sequence |
| C626 | 3–4 | control structure — selection |
| C632 | 5–6 | control structure — iteration / repetition |
C625 — Sequence
Definition. A set of instructions that executes line by line in the order that it is written.
Minimum two lines whose order matters — label the start and end:
# C625 sequence: start var zone: int = int($ZoneInput.text) var fare: float = FARE_TABLE[zone] balance -= fare $BalanceLabel.text = "Balance: $%.2f" % balance # C625 sequence: end
Earns the tick: a labelled block that breaks if you swap two lines. Doesn't: one isolated statement (that's C611).
In connect-go-dots (grid.gd) — store the choice first, then switch screens:
# connect-go-dots — grid.gd func _open(photo: Texture2D) -> void: Shared.photo = photo # C625 sequence: store the choice… get_tree().change_scene_to_file("res://detail.tscn") # …then change scene
C626 — Selection
Definition. A control structure that allows a programmer to write lines of code that are only run when a particular requirement is met.
If
When condition is met, flow is directed to the alternative instruction.
if condition: # C626 — selection # code
If … Then … Else (chained selection)
When condition is met, flow can be directed multiple times. Chained selection: more than one condition checked in sequence — each branch can test a different condition, and execution stops at the first branch whose condition is true.
if condition: # C626 — chained selection # code elif other_condition: # code else: # code
Switch or Case (match)
Choose between listed alternatives. Unlike chained selection, every case tests the same expression for equality against a different value.
match value: # C626 — selection: match 1: # code 2: # code
In club-ladder (team.gd) — a real match, with the wildcard _ as the catch-all:
# club-ladder — team.gd func record(result: String) -> void: match result: # C626 — selection: match with a catch-all "win": wins += 1 "draw": draws += 1 _: losses += 1 # anything that is not a win or a draw
Myki example
# C626 selection: pick the fare rule if is_concession: fare = FARE_TABLE[zone] * 0.5 elif is_weekend: fare = WEEKEND_CAP else: fare = FARE_TABLE[zone]
Nested selection — a selection inside another selection's structure — is also C626 evidence; use the word "nested" in validation.
Earns the tick: a condition that changes what runs, demonstrated with both outcomes. An if whose else can never happen is weak evidence.
In tile-matching-game (game.gd) — both selection shapes:
# tile-matching-game — game.gd if is_busy or card.is_face_up or card.is_matched: # C626 — guard clause return # bail out early on any bad click if first_card.pair_id == second_card.pair_id: # C626 — selection: two outcomes _handle_match() else: await _handle_mismatch()
C632 — Iteration / repetition
Definitions. WHILE: an iteration repeated for as long as a condition is met. FOR: an iteration repeated a predefined number of times. Infinite loop: an iteration that will never reach the condition upon which it can terminate.
While …
May not execute to satisfy condition.
while condition: # C632 — iteration # code
Do … While
May not execute if condition is not satisfied once.
No do … while construct in GDScript — a pre-test while loop covers this behaviour:
while condition: # C632 — iteration # code
Repeat … Until
Executes at least once. If conditions are not met, there is a possibility of an infinite loop.
No repeat … until construct in GDScript — emulate a post-test loop with while true: and a break when the condition is met:
while true: # C632 — post-test iteration # code if condition: break
For … Next
A counting loop to be executed a set number of times.
for i in range(10): # C632 — counting iteration # code
For … In
A counting loop that iterates over items in an array or list.
var cats = ["Whiskers", "Fluffy"] for cat in cats: # C632 — iteration over an array print(cat)
Myki example
# C632 iteration: total up today's journeys var total: float = 0.0 for journey in journeys: total += journey["fare"]
In connect-go-dots (grid.gd) — one loop wires every photo button:
# connect-go-dots — grid.gd for button in %Photos.get_children(): # C632 — iteration button.pressed.connect(_open.bind(button.texture_normal))
get_children() returns an array of the six TextureButtons and the loop visits each in turn. (%Photos finds the node by its scene-unique name.)
In tile-matching-game (deck.gd) — a real while whose end is guaranteed:
# tile-matching-game — deck.gd while not file.eof_reached(): # C632 — ends when the file runs out of rows var row := file.get_csv_line()
Earns the tick: a loop over real data — a for over your own array, or a while whose condition provably terminates. Be ready to explain why the loop ends: the infinite-loop question is a validation favourite.
Check Your Understanding
- In a
match, what does every case compare?
Answer
The same expression against a different value — unlike chained elif, where each branch can test something different.
- GDScript has no
repeat … until. What is the accepted emulation?
Answer
while true: with if condition: break at the end of the body — runs at least once, tests after.
- What two questions about any loop should you be ready to answer live?
Answer
What it iterates over, and why it must end.
